// 封装购物车模块

import { defineStore } from 'pinia'
import { ref, computed } from 'vue'
import { useUserStore } from './user.js'
import { addCartAPI, getCartListAPI, delCartAPI } from '@/apis/cart.js'

export const useCartStore = defineStore(
  'cart',
  () => {
    // 一、state区域
    const cartList = ref([])
    const userStore = useUserStore()

    // 二、action区域
    // 从服务器获取最新购物车列表
    const getCartList = async () => {
      const res = await getCartListAPI()
      cartList.value = res.result
    }

    // 添加商品到购物车
    const addCart = async (goods) => {
      if (isLogin.value) {
        // 登录之后的加入购物车逻辑
        const { skuId, count } = goods
        await addCartAPI({ skuId, count })
        getCartList()
      } else {
        // 本地cartList维护
        // 判断商品是否在购物车中，使用skuID来判断
        // 商品已在购物车中 - 该商品增加count数量
        // 商品未在购物车中 - 添加该商品push到购物车里
        const item = cartList.value.find((item) => item.skuId === goods.skuId)
        if (item) {
          item.count += goods.count
        } else {
          cartList.value.push(goods)
        }
      }
    }

    // 从购物车删除商品
    const delCart = async (skuId) => {
      if (isLogin.value) {
        // 登录之后的删除购物车商品逻辑
        await delCartAPI([skuId])
        getCartList()
      } else {
        // 本地cartList维护
        const index = cartList.value.findIndex((item) => item.skuId === skuId)
        cartList.value.splice(index, 1)
      }
    }

    // 退出登录时，清空购物车
    const clearCart = () => {
      cartList.value = []
    }

    // 单选功能
    const singleCheck = (skuId, selected) => {
      const item = cartList.value.find((item) => item.skuId === skuId)
      item.selected = selected
    }
    // 全选功能
    const allCheck = (selected) => {
      cartList.value.forEach((item) => (item.selected = selected))
    }

    // 三、计算属性
    // 1.商品数量 全部商品count之和
    // 2.商品总价 全部商品count * price 之和
    // 3.全选功能
    // 4.已选择数量
    // 5.已选择商品合计
    // 6.当前登录状态
    // 商品数量
    const totalCount = computed(() =>
      cartList.value.reduce((sum, item) => sum + item.count, 0)
    )
    // 商品总价
    const totalPrice = computed(() =>
      cartList.value.reduce((sum, item) => sum + item.count * item.price, 0)
    )
    // 是否全选
    const isAll = computed(() =>
      cartList.value.every((item) => item.selected === true)
    )
    // 已选择的商品数量
    const selectedCount = computed(() =>
      cartList.value.reduce(
        (sum, item) => sum + (item.selected ? item.count : 0),
        0
      )
    )
    // 已选择的商品总价
    const selectedPrice = computed(() =>
      cartList.value.reduce(
        (sum, item) => sum + (item.selected ? item.count * item.price : 0),
        0
      )
    )
    // 当前登录状态
    const isLogin = computed(() => userStore.userInfo.token)

    return {
      cartList,
      addCart,
      delCart,
      singleCheck,
      allCheck,
      clearCart,
      getCartList,
      totalCount,
      totalPrice,
      isAll,
      selectedCount,
      selectedPrice,
      isLogin
    }
  },
  { persist: true }
)
